架构概览
用户浏览器 (HTTPS)
↓
宿主机 Nginx (监听 443 端口,启用 HTTPS)
↓
反向代理至宿主机端口 (如 8080)
↓
Docker Compose 内部 Nginx (监听 80)
↓
WordPress + PHP-FPM + MySQL
推荐架构组成
1. Docker Compose 内部服务:
– WordPress:运行在 wordpress:6.x-fpm 镜像中,负责 PHP 动态渲染。
– Nginx(容器):作为反向代理,代理请求到 PHP-FPM。
– MySQL:数据库容器,提供数据支持。
2. 宿主机服务:
– Nginx(宿主机安装):监听 443 端口,启用 HTTPS,反向代理到容器内的 Nginx(或直接到 PHP)。
为什么推荐宿主机部署 Nginx 并做 HTTPS 反向代理?
1. 更灵活的 HTTPS 证书管理
– 使用 Let’s Encrypt 获取免费 SSL 证书更方便(如用 certbot)。
– 避免将私钥、证书挂载到容器中,提高安全性。
2. 避免容器内直接监听 443 端口
– 宿主机 443 端口通常是保留端口,非 root 用户无法监听。
– 容器内监听 443 会增加网络映射和权限配置的复杂性。
3. 分离 HTTPS 与应用逻辑,更清晰的职责划分
– 宿主机 Nginx 专注于 TLS 协议、证书更新。
– 容器 Nginx 专注于应用反代、静态资源处理。
4. 方便统一管理多个站点或服务
– 宿主机 Nginx 可统一处理多个域名、站点的 HTTPS 配置。
– 每个站点可以独立配置反代目标。
5. 便于调试、日志分析和性能优化
– HTTPS 层面日志和限流等可独立在宿主机 Nginx 中处理。
– 不需要每次调整 HTTPS 都重新构建容器。
2. 宿主机 Nginx HTTPS 配置:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
3. WordPress 配置建议(wp-config.php):
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
define('WP_HOME', 'https://yourdomain.com');
define('WP_SITEURL', 'https://yourdomain.com');
总结
| 目标 | 推荐做法 |
|---|---|
| 启用 HTTPS | 使用宿主机 Nginx 管理证书 |
| WordPress 识别 HTTPS | 设置 X-Forwarded-Proto 和 $_SERVER[‘HTTPS’] |
| URL 显示 https:// | 设置 WP_HOME 和 WP_SITEURL |
| 更安全的架构 | TLS/SSL 与应用分离部署 |
附加建议
配合 Cloudflare/CDN 可进一步提升性能和安全性。
定期用 certbot renew 自动更新 HTTPS 证书。
宿主机 Nginx 可以做缓存、限流、WAF 等高级功能。